<?php
/**
*  Project Name: 芝士活动
*  @package :  class.main
*  @classID :  Application.class.php
*  @author  :  邝达峰 
*  @date    : 2017-07-11
* 　动作控制器
*/

#加载异常处理类
require_once SYSTEM_CLASS_PATH.'main'.DIRECTORY_SEPARATOR.'Exception.class.php';
#加载基类
require_once SYSTEM_CLASS_PATH.'main'.DIRECTORY_SEPARATOR.'BaseAction.class.php';

class ApplicationController
{
	public $module;//模块变量
	public $action;//动作变量
	public $cmd;//函数变量
	protected $class;//对象实例变量
	static $action_code_file;//动作文件
	static $action_tpl_file;//模板文件


	/**
    * 构造函数
    * @param:  NULL
    * @return: NULL
    * @access: public
    */
	public function __construct(){
		
	}


	/**
    * 析构函数
    * @param:  NULL
    * @return: NULL
    * @access: public
    */
	public function __destruct(){
		#释放给定的变量
		unset($_REQUEST);//释放请求参数
		unset($GLOBALS);//释放公共变量
	}

	/**
	 * 唯一实例
	 */
	public static function &getInstance()
	{
		static $instance;
		if (!isset($instance)){
			$c = __CLASS__;
			$instance = new $c;
		}
		return $instance;
	}

	/**
	 * 初始化控制器
	 */
	public static function _init()
	{
		#设置内存限制
		setMemoryLimit();
		#创建唯一实例
		$controller =&self::getInstance();
		#路由处理
		$controller->routerHandle();
		
		#读取模块
		$controller->loadModule();
		#执行控制器
		$controller->doAction();
		#获取到控制器对象
		$action = &$controller->getClassInstance();
		#运行控制对象
		$action->run();
		#设置smarty的公共变量$GLOBALS输出值
		$action->setAssign();
        $action->tplAssignVar();
		#模板显示
		BaseAction::$smarty->display(self::$action_tpl_file);
		#结束程序
		exit(0);
	}


	/**
	 * 读取模块信息
	 * @return void
	 */
	public function loadModule()
	{
		$this->module = empty($_REQUEST[MODULE_NAME])?MODULE_DEFAULT_NAME:$_REQUEST[MODULE_NAME];
	}

	/**
	 * 读取模块代码
	 * @return void
	 */
	public function doAction()
	{
		#获取控制器名和模板名
		$this->action = empty($_REQUEST[CONTROLLER_NAME])?CONTROLLER_DEFAULT_NAME:$_REQUEST[CONTROLLER_NAME];
		#控制器文件
		self::$action_code_file = SYSTEM_CODE_PATH.$this->module.DIRECTORY_SEPARATOR.$this->action.'.class.php';
		#模板文件
		self::$action_tpl_file = USER_THEME_PATH.$this->module.DIRECTORY_SEPARATOR.$this->action.'.html';
		#判断控制器是否存在
		if(is_file(self::$action_code_file)){
			require_once self::$action_code_file;
		}
		else
		{
			#判断模板是否存在，如果存在直接读取模板
			if(is_file(self::$action_tpl_file)){
				#显示smarty模板
				Action::getSmarty()->display(self::$action_tpl_file);
				exit();
			}
			else
			{
				#判断文件是否存在,就访问根目录文件
				$strRootFilePath = SYSTEM_WEB_ROOT_PATH.$_SERVER['REQUEST_URI'];
				if(file_exists($strRootFilePath) && is_file($strRootFilePath)){
					$data = file_get_contents($strRootFilePath);
					echo $data;
					exit();
				}else{
					#错误输出
					throwException($GLOBALS['lang']['MODULE_IS_NOT_EXISTS']);
				}
			}
		}
	}

	/**
	 * 快速创建一个对象实例
	 *
	 * @return boolean
	 */
	public static function &C($className) {
		static $class = array();
		#将类名的首字母转换为大写
		$className = ucfirst($className);
		#判断类名是否存在
		if (!isset($class[$className])){
			if(class_exists($className)) {
				$class[$className] = new $className();
			}else{
				return false;
			}
		}
		return $class[$className];
	}

	/**
	 * 路由处理
	 * @return void
	 */
	private function routerHandle()
	{         
		
		
		#获取配置文件
		$arrUrlConfig = Config::get('url');
		$router_url_conf = $arrUrlConfig['router_url_conf'];
		$skip_url_conf = $arrUrlConfig['skip_url_conf'];
		#创建路由对象
		
		$objRouter  = new Router();
		#处理页面跳转
		if(is_array($skip_url_conf) && count($skip_url_conf) > 0){
			$objRouter->url_301_skip($skip_url_conf);
		}
		
		#地址路由重写处理
		if(is_array($router_url_conf) && count($router_url_conf) > 0){
			$objRouter->url_rewrite_handle($router_url_conf);
		}
		
		#处理GET参数
		if(strpos($_GET[CONTROLLER_NAME], '-') !== false){
			
			$arrPassId = explode('-',$_GET[CONTROLLER_NAME]);
			$arrPassNum = count($arrPassId);
			$_GET[CONTROLLER_NAME] = $arrPassId[0];
			$i = 1;
			if(($arrPassNum+1) % 2 != 0){
				if($_GET[CONTROLLER_NAME]==FUNCTION_NAME){
					$_GET[CONTROLLER_NAME] = CONTROLLER_DEFAULT_NAME;
					$_GET[FUNCTION_NAME] = $arrPassId[$i++];
				}
			}
			#处理参数
			for(;$i < $arrPassNum; $i++){
				$_GET[$arrPassId[$i]] = $arrPassId[++$i];
			}
		}
		
		#处理参数
		$arrRequestUri = parse_url($_SERVER['REQUEST_URI']);
		if(is_array($arrRequestUri) && count($arrRequestUri) > 0){
			if(!empty($arrRequestUri['query'])){
				$arrRequestQuery = explode('&',$arrRequestUri['query']);
				if(is_array($arrRequestQuery) && count($arrRequestQuery)>0){
					foreach ($arrRequestQuery as $k=>$v){
						$arrParams = explode('=',$v);
						$_GET[$arrParams[0]] = $_POST[$arrParams[0]] = $arrParams[1];
					}
				}
			}
		}
		#参数过滤与防攻击处理
		$objRouter->injectParamFilter();
		#组合参数
		$_REQUEST = array_merge($_POST,$_GET);
	}


	/**
	* 得到对象缓存
	* @return: $object
	* @access: private
	*/
	private function &getClassInstance()
	{
		#获取对象
		$object = &self::C($this->action);
		if($object){
			return $object;
		}
		else{
			throwException($GLOBALS['lang']['CLASS_IS_NOT_EXISTS']);
		}
	}

}
?>